# encoding: UTF-8
require 'set'
require_relative 'reemplazo'
require_relative 'secuencia_fonetica'

class EstrategiaDeReemplazo

	def initialize(nombre, reemplazos)
		@nombre = nombre
		@reemplazos = reemplazos
	end

	def alteraciones_posibles(secuencia_fonetica)
		# devuelve lista de secuencias fonéticas
		# producto de aplicar (o no) cada posible
		# reemplazo sobre la secuencia.
		obtener_reemplazos(secuencia_fonetica)
	end

	def obtener_reemplazos(secuencia_fonetica, secuencias_actuales = Set.new())
		seguir_buscando = true
		seguir_buscando = false
		nuevas_secuencias = Set.new()
		nuevos = @reemplazos.each {|reemplazo|
			representacion_actual = String.new(secuencia_fonetica.representacion_escrita)
			indices = (0 .. representacion_actual.length - 1).find_all { |indice| representacion_actual[indice,reemplazo.cadena_a_reemplazar.length] == reemplazo.cadena_a_reemplazar }
			indices.each {|indice| 
				texto = String.new(secuencia_fonetica.representacion_escrita)
				texto[indice,reemplazo.cadena_a_reemplazar.length] = reemplazo.cadena_a_insertar
				secuencia_nueva = SecuenciaFonetica.new(texto)
				nuevas_secuencias.add(secuencia_nueva) unless secuencias_actuales.include? secuencia_nueva
			}
		}
		if nuevas_secuencias.length > 0 then
			secuencias_actuales = secuencias_actuales | nuevas_secuencias
			secuencias_actuales.each {|secuencia|
				secuencias_actuales = obtener_reemplazos(secuencia, secuencias_actuales)
			}
		end
		secuencias_actuales
	end
end
